package DesignPatterns.Singleton;

import 线程池的使用.thread.ThreadPool;

/**
 * 单例模式-懒汉模式
 *  按照需求调用instance方法,但是却带来线程不安全的问题
 *  线程1 调用getInstance时,没有尚未获取对象
 *  线程2 开始调用,发现Instance仍然为null,二次获取对象, 这样就会造成线程安全问题
 *
 *  可以通过加锁的方式解决
 * @author yangjicong
 * @date 2022/7/9
 */
public class Singleton2 {
    private static  Singleton2 INSTANCE;

    private Singleton2(){ }

    public static synchronized Singleton2 getInstance(){
        if (INSTANCE == null) {
            INSTANCE = new Singleton2();
        }
        return INSTANCE;
    }

    /**
     * 线程安全,如下案例
     * @param args
     */
    public static void main(String[] args) {
        //不同对象的hashcode是不同的
        for (int i = 0; i < 100; i++) {


            //ThreadPool.execute(new Runnable() {
            //    @Override
            //    public void run() {
            //       System.out.println(Singleton2.getInstance().hashCode());
            //    }
            //});
            new Thread(()-> System.out.println(Singleton2.getInstance().hashCode())).start();
        }
    }

}
